import { message } from 'antd';

/**
 * 全局错误处理器
 * 用于捕获未处理的Promise拒绝和JavaScript错误
 */
class GlobalErrorHandler {
  constructor() {
    this.setupErrorHandlers();
  }

  setupErrorHandlers() {
    // 捕获未处理的Promise拒绝
    window.addEventListener('unhandledrejection', this.handleUnhandledRejection.bind(this));
    
    // 捕获JavaScript运行时错误
    window.addEventListener('error', this.handleError.bind(this));
    
    // 捕获资源加载错误
    window.addEventListener('error', this.handleResourceError.bind(this), true);
  }

  handleUnhandledRejection(event) {
    console.error('未处理的Promise拒绝:', event.reason);
    
    // 阻止默认的错误处理（避免在控制台显示错误）
    event.preventDefault();
    
    // 根据错误类型显示不同的提示
    let errorMessage = '操作失败，请稍后重试';
    
    if (event.reason && typeof event.reason === 'object') {
      if (event.reason.response) {
        // 这是一个HTTP错误
        const status = event.reason.response.status;
        if (status === 401) {
          errorMessage = '登录已过期，请重新登录';
          // 跳转到登录页
          setTimeout(() => {
            window.location.href = '/login';
          }, 1500);
        } else if (status >= 500) {
          errorMessage = '服务器暂时不可用，请稍后重试';
        } else if (status === 404) {
          errorMessage = '请求的资源不存在';
        }
      } else if (event.reason.code === 'NETWORK_ERROR') {
        errorMessage = '网络连接失败，请检查网络';
      } else if (event.reason.message) {
        errorMessage = event.reason.message;
      }
    } else if (typeof event.reason === 'string') {
      errorMessage = event.reason;
    }
    
    // 显示错误提示
    message.error(errorMessage);
  }

  handleError(event) {
    console.error('JavaScript错误:', event.error);
    
    // 如果是资源加载错误，不处理（由handleResourceError处理）
    if (event.target !== window) {
      return;
    }
    
    // 阻止默认的错误处理
    event.preventDefault();
    
    // 显示用户友好的错误提示
    message.error('页面出现异常，请刷新页面重试');
  }

  handleResourceError(event) {
    // 处理资源加载错误（图片、脚本、样式表等）
    if (event.target !== window) {
      console.error('资源加载失败:', event.target.src || event.target.href);
      
      // 对于关键资源加载失败，显示提示
      if (event.target.tagName === 'SCRIPT') {
        message.warning('部分功能可能无法正常使用，请刷新页面重试');
      }
    }
  }

  // 移除错误监听器
  destroy() {
    window.removeEventListener('unhandledrejection', this.handleUnhandledRejection.bind(this));
    window.removeEventListener('error', this.handleError.bind(this));
    window.removeEventListener('error', this.handleResourceError.bind(this), true);
  }
}

// 创建全局错误处理器实例
const globalErrorHandler = new GlobalErrorHandler();

export default globalErrorHandler;